using Microsoft.AspNetCore.Mvc; // 引入ASP.NET Core MVC框架的核心功能
using UniversalAdmin.Application.Contracts; // 引入应用层契约接口定义
using UniversalAdmin.Application.DTOs; // 引入数据传输对象定义，用于API与服务的交互
using UniversalAdmin.Application.Services; // 引入应用层服务实现

namespace UniversalAdmin.Api.Controllers; // 定义API控制器的命名空间

[ApiController] // 标识该类为API控制器，自动处理模型验证和错误响应
[Route("api/v1/[controller]")] // 定义路由模板，[controller]会被替换为控制器名称（Personal）
public class PersonalController : ControllerBase // 继承ControllerBase，提供基础的API控制器功能
{
    private readonly IPersonalService _personalService; // 个人信息服务接口实例，通过依赖注入获取

    // 构造函数，注入IPersonalService依赖
    public PersonalController(IPersonalService personalService)
    {
        _personalService = personalService; // 初始化个人信息服务
    }

    // HTTP GET方法，获取用户个人资料
    [HttpGet("{id:guid}/profile")] // 定义路由模板，id为GUID类型
    public async Task<ActionResult<UserProfileResponseDto>> Get(Guid id)
    {
        // 调用个人信息服务获取用户信息
        var user = await _personalService.GetCurrentUserAsync(id);
        // 如果用户不存在，返回404 Not Found响应
        if (user == null) return NotFound();
        // 使用 ??"" 来处理可能为 null 的 Email，避免 CS8602 警告
        // 返回用户个人资料响应DTO
        return new UserProfileResponseDto(user.Id, user.Username, user.Email ?? "", user.PhoneNumber, user.Avatar, user.Bio);
    }

    // HTTP PUT方法，更新用户个人资料
    [HttpPut("{id:guid}/profile")] // 定义路由模板，id为GUID类型
    public async Task<ActionResult> UpdateProfileAsync(Guid id,
                                                       [FromBody] UpdateProfileRequestDto dto)
    {
        // 将 dto 对象直接传给服务方法，而不是它的各个属性
        await _personalService.UpdateProfileAsync(id, dto);
        // 返回204 No Content响应，表示操作成功但无返回内容
        return NoContent();
    }

    // HTTP PUT方法，修改用户密码
    [HttpPut("{id:guid}/password")] // 定义路由模板，id为GUID类型
    public async Task<ActionResult> ChangePasswordAsync(Guid id,
                                                        [FromBody] ChangePasswordRequestDto dto)
    {
        // 这个调用方式是正确的，因为它与接口定义匹配
        await _personalService.ChangePasswordAsync(id, dto.OldPassword, dto.NewPassword);
        // 返回204 No Content响应，表示操作成功但无返回内容
        return NoContent();
    }
}